package 斐波那契数列问题;

import java.util.Scanner;

public class test1 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        System.out.println(tribonacci(n));

        // 动态规划
        /**
         * 1.状态表示(一般是由一个数组dp表  一维/二维)
         * 填满dp表,里面某一个值可能就是最后的结果
         * 状态就是: 表里面某一个值的含义
         * 2.状态转移方程
         * 求出 dp[i] 的方程,通用
         * 3.初始化
         * 要保证填表的时候不越界
         */
    }

    //超时
//    public static int tribonacci(int n) {
//        // T[n] = T[n-1]+T[n-2]+T[n-3]
//        if(n == 0)
//            return 0;
//        if(n==1||n==2)
//            return 1;
//        return tribonacci(n-1)+tribonacci(n-2)+tribonacci(n-3);
//    }

    public static int tribonacci(int n) {
        // T[n] = T[n-1]+T[n-2]+T[n-3]  --> 状态转移方程
        // dp[i] 表示第i个题目要的数
        if(n == 0)
            return 0;
        if(n==1||n==2)
            return 1;
        int[] dp = new int[n+1];
        dp[0] = 0;
        dp[1] = dp[2] = 1;

        for (int i = 3; i <= n; i++) {
            dp[i] = dp[i-1]+dp[i-2]+dp[i-3];
        }

        return dp[n];
    }
}
